package roleservicelogic

import (
	"smile-sunshine-micorservice/rpc/User/db/crud"

	"context"

	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"

	"smile-sunshine-micorservice/rpc/User/internal/svc"
	"smile-sunshine-micorservice/rpc/User/pb/zipTako.com/SmileSunshine/user"

	"github.com/zeromicro/go-zero/core/logx"
)

type ListRolesLogic struct {
	ctx    context.Context
	svcCtx *svc.ServiceContext
	logx.Logger
	RolesModel crud.RolesModel // 添加 RolesModel 字段
}

func NewListRolesLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ListRolesLogic {
	return &ListRolesLogic{
		ctx:        ctx,
		svcCtx:     svcCtx,
		Logger:     logx.WithContext(ctx),
		RolesModel: crud.NewRolesModel(svcCtx.SqlConn, svcCtx.CacheConf), // 初始化 RolesModel
	}
}

func (l *ListRolesLogic) ListRoles(in *user.ListRolesRequest) (*user.ListRolesResponse, error) {
	l.Logger.Infof("收到列出角色请求，页码：%d，每页数量：%d", in.Page, in.PageSize)

	// 1. 设置默认分页参数
	page := in.Page
	if page <= 0 {
		page = 1
	}
	pageSize := in.PageSize
	if pageSize <= 0 {
		pageSize = 10 // 默认每页10条
	} else if pageSize > 100 {
		pageSize = 100 // 最大每页100条
	}

	// 2. 查询总数
	total, err := l.RolesModel.CountAll(l.ctx)
	if err != nil {
		l.Logger.Errorf("查询角色总数失败：%v", err)
		return nil, status.Error(codes.Internal, "获取角色列表失败")
	}

	// 3. 查询分页数据
	rolesData, err := l.RolesModel.FindAll(l.ctx, page, pageSize)
	if err != nil {
		l.Logger.Errorf("查询角色分页数据失败：%v", err)
		return nil, status.Error(codes.Internal, "获取角色列表失败")
	}

	// 4. 转换数据格式
	pbRoles := make([]*user.Role, 0, len(rolesData))
	for _, role := range rolesData {
		pbRoles = append(pbRoles, &user.Role{
			Id:          role.Id,
			Name:        role.Name,
			Description: role.Description.String,
			// CreatedAt 和 UpdatedAt 可以根据需要添加转换
		})
	}

	// 5. 返回响应
	return &user.ListRolesResponse{
		Roles: pbRoles,
		Total: total,
	}, nil
}
